import moment from 'moment'
import { Dispatch } from 'redux'
import { AnyAction } from 'redux'
import { USER } from '../constants'
// 检查 value 是否是普通对象。 也就是说该对象由 Object 构造函数创建
// _.isPlainObject({ 'x': 0, 'y': 0 }); => true
// _.isPlainObject(Object.create(null)); => true
import { isPlainObject } from 'lodash'
import { LOCAL_STORAGE } from '../../constants'
import { serviceLoginByToken, serviceLogout } from '../../request/user'
import CONFIG from '../../config'

const { LOGIN } = USER

// 登录就返回包含用户信息的action对象
export function setUser(userInfo: any = {}): AnyAction {
  if (userInfo.createdAt) {
    userInfo.createdAt = moment(userInfo.createdAt).format('YYYY-MM-DD')
  }
  return {
    type: LOGIN,
    userInfo: userInfo,
  }
}

// 验证本地登录状态
export function validateLocalStatus(): AnyAction {
  let userInfo = {}
  let temp = window.sessionStorage.getItem(LOCAL_STORAGE.USER)
  if (typeof temp === 'string') {
    userInfo = JSON.parse(temp)
  }
  // 检查 userInfo 是否是普通对象，即该对象是否由 Object 构造函数创建
  if (!isPlainObject(userInfo)) userInfo = {}
  // 返回包含用户信息的action对象
  return setUser(userInfo)
}

// token 登录
export function loginByToken(token: string) {
  // 这个函数是作为redux-thunk的dispatch函数的参数
  return function (dispatch: Dispatch) {
    return serviceLoginByToken(token).then((res: any) => {
      if (res.data.success) {
        const userInfo = res.data.data.userInfo
        // 登录就dispatch设置用户信息的action对象，reducer根据有无token而决定是否缓存用户信息
        return dispatch(setUser(userInfo))
      }
      return dispatch(setUser())
    })
  }
}

// 注销登录
export function logout() {
  serviceLogout().finally(() => {
    window.sessionStorage.clear()
    window.location.reload()
  })
}

// Github Auth 第三方登录验证
export function githubAuthorization() {
  const url = `https://github.com/login/oauth/authorize?response_type=code&redirect_uri=${CONFIG.github.callbackURL}&client_id=${CONFIG.github.clientId}`
  window.location.replace(url)
}
